home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / gemevnts.c < prev    next >
C/C++ Source or Header  |  1996-05-27  |  13KB  |  540 lines

  1. /*
  2.  * gemevnts.c
  3.  *
  4.  * Purpose:
  5.  * --------
  6.  * Traitement de divers ‚vˆnements GEM
  7.  *
  8.  * History:
  9.  * --------
  10.  * fplanque: Created
  11.  */
  12.  
  13.  
  14.      #include "!OPTIONS.H"                /* Options de compilation */         
  15.     #define    THIS_FILE    "GEMEVNTS.C v1.00 - 03.95"
  16.           
  17.  
  18. /*
  19.  * System headers:
  20.  */
  21.     #include    <aes.h>                        /* header AES */
  22.     #include <stdio.h>
  23.  
  24. /*
  25.  * Custom headers:
  26.  */
  27.     #include    "SPEC_PU.H"                    /* Macros */
  28.     #include "WIN_PU.H"
  29.     #include "WINDR_PU.H"
  30.     #include    "DEBUG_PU.H"
  31.     #include    "TEXT_PU.H"
  32.  
  33. /*
  34.  * ------------------------ PROTOTYPES -------------------------
  35.  */
  36.  
  37. /*
  38.  * EXTernal prototypes:
  39.  */
  40.     /* 
  41.      * Objets: 
  42.      */
  43.     extern    void    rearrange_dir( WIPARAMS *wi_params_adr, int new_w );
  44.  
  45. /*
  46.  * ------------------------ VARIABLES -------------------------
  47.  */
  48.     
  49. /*
  50.  * External variables: 
  51.  */
  52.     /* 
  53.      * G‚n‚ral: 
  54.      */
  55.     extern    int        G_x_mini, G_y_mini;        /* Coord sup gauche de l'‚cran */
  56.     extern    int        G_w_maxi, G_h_maxi;        /* Taille de l'‚cran de travail */
  57.     extern    int        G_ev_mgpbuff[8];            /* Buffer d'‚venements GEM */
  58.     /*
  59.      * Ic“nes: 
  60.      */
  61.     extern    int        G_icon_w, G_icon_h;    /* Dimensions des ic“nes */
  62.  
  63.  
  64.     
  65. /*
  66.  * Private variables: 
  67.  */
  68.     /* 
  69.      * Buffers: 
  70.      */
  71.     static    int    MB_new_x, MB_new_y, MB_new_w, MB_new_h; 
  72.     static    long    MB_old_pos, MB_new_pos;
  73.      
  74.  
  75. /*
  76.  * ------------------------ FUNCTIONS -------------------------
  77.  */
  78.  
  79. /*
  80.  * msg_fulled(-)
  81.  *
  82.  * Purpose:
  83.  * --------
  84.  * WM_FULLED : Full_screen ou r‚duction de fenêtre
  85.  *
  86.  * History:
  87.  * --------
  88.  * 1993: fplanque: Created
  89.  */
  90. void    msg_fulled( 
  91.             WIPARAMS    *wi_params_adr )
  92. {
  93.     /* 
  94.      * Variables: 
  95.      */
  96.     int    wi_handle = wi_params_adr ->  handle;    
  97.  
  98.     /*
  99.      * Teste si c'est un agrandissement ou une r‚duction: 
  100.      */
  101.     if (wi_params_adr -> fulled == 0)      /* si taille norm */
  102.     {                    
  103.         wind_get( wi_handle, WF_FULLXYWH, &MB_new_x, &MB_new_y, &MB_new_w, &MB_new_h);
  104.         wi_params_adr -> fulled = 1;        /* Taille max */
  105.     }
  106.     else
  107.     {
  108.         wind_get( wi_handle, WF_PREVXYWH, &MB_new_x, &MB_new_y, &MB_new_w, &MB_new_h);
  109.         wi_params_adr -> fulled = 0;        /* Taille norm */                    
  110.     }
  111.  
  112.     switch( wi_params_adr -> type )    
  113.     {
  114.         case    TYP_DIR:
  115.             /*
  116.              * Contr“le s'il faut r‚-arranger les ic“nes: 
  117.              */
  118.             if (    MB_new_w >= (wi_params_adr -> more + G_icon_w)
  119.                 ||    MB_new_w < (wi_params_adr -> more ) )
  120.             {
  121.                 /*
  122.                  * R‚arrange ic“nes: 
  123.                  */
  124.                 rearrange_dir( wi_params_adr, MB_new_w );
  125.  
  126.                 /*
  127.                  * Demande redraw total de la fenˆtre: 
  128.                  */
  129.                 send_fullredraw( wi_params_adr );
  130.             };
  131.  
  132.             /*
  133.              * Change les coordonn‚es de l'arbe d'objets … l'‚cran: 
  134.              */
  135.             (wi_params_adr -> draw_ptr.tree) -> ob_x +=
  136.                 MB_new_x - wi_params_adr -> curr_x;
  137.             (wi_params_adr -> draw_ptr.tree) -> ob_y +=
  138.                 MB_new_y - wi_params_adr -> curr_y;
  139.             break;
  140.     }
  141.  
  142.     wind_set( wi_handle, WF_CURRXYWH, MB_new_x, MB_new_y, MB_new_w, MB_new_h);
  143.     wi_params_adr -> curr_x = MB_new_x;
  144.     wi_params_adr -> curr_y = MB_new_y;
  145.     wi_params_adr -> curr_w = MB_new_w;
  146.     wi_params_adr -> curr_h = MB_new_h;
  147.  
  148.     /*
  149.      * Taille asc et repositionnement contenu si n‚cessaire:
  150.      */
  151.     wi_resize( wi_params_adr ); 
  152.  
  153.     /*
  154.      * On s'occupe de positionner le formulaire pour le prochain redraw: 
  155.      */
  156.     if ( wi_params_adr -> type == TYP_ARBO )
  157.     {    /*
  158.          * Si positionnement n‚cessaire: 
  159.          */
  160.         fixform_window( wi_params_adr );        /* Fixe nlle position formulaire */
  161.     }
  162.  
  163. }
  164.  
  165.  
  166.  
  167. /*
  168.  * msg_arrowed(-)
  169.  *
  170.  * Purpose:
  171.  * --------
  172.  * WM_ARROWED : Flˆches de d‚placement
  173.  *
  174.  * History:
  175.  * --------
  176.  * 1993: fplanque: Created
  177.  * 26.09.94: support type TYP_ERRORS
  178.  */
  179. void    msg_arrowed( WIPARAMS    *wi_params_adr )
  180. {
  181.     /* printf("Seen_h=%d\n", wi_params_adr -> seen_h ); */
  182.  
  183.     /* Selon le type d'ARROW: */
  184.     switch ( G_ev_mgpbuff[4] )
  185.     {
  186.         /* D‚placement vertical */
  187.         case 0:
  188.         case 1:
  189.         case 2:
  190.         case 3:
  191.             switch ( G_ev_mgpbuff[4] )
  192.             {
  193.                 case 0:                        /* Page vers le haut */
  194.                     MB_new_pos = l_max ( 0, wi_params_adr -> seen_y
  195.                         - wi_params_adr -> seen_h );
  196.                     break;
  197.  
  198.                 case 1:                        /* Page vers le bas */
  199.                     MB_new_pos = l_min ( wi_params_adr -> total_h - wi_params_adr -> seen_h, 
  200.                         wi_params_adr -> seen_y + wi_params_adr -> seen_h );
  201.                     MB_new_pos = MAX( MB_new_pos, 0 );
  202.                     break;
  203.                     
  204.                 case 2:                        /* Ligne vers le haut */
  205.                     MB_new_pos = l_max ( 0, wi_params_adr -> seen_y - wi_params_adr -> v_step );
  206.                     break;
  207.  
  208.                 case 3:                        /* Ligne vers le bas */
  209.                     MB_new_pos = l_min ( wi_params_adr -> total_h - wi_params_adr -> seen_h, 
  210.                         wi_params_adr -> seen_y + wi_params_adr -> v_step );
  211.                     MB_new_pos = MAX( MB_new_pos, 0 );
  212.                     break;
  213.             }
  214.  
  215.             if ( MB_new_pos != wi_params_adr -> seen_y )
  216.             {    /*
  217.                  * Si la position verticale a chang‚:
  218.                  */
  219.                 switch( wi_params_adr -> type )
  220.                 {
  221.                     case    TYP_TEXT:
  222.                     case    TYP_DEBUG:
  223.                     case    TYP_ERRORS:
  224.                         /*
  225.                          * Fixe nouvelle ligne se trouvant en haut de l'‚cran: 
  226.                          */
  227.                         vmove_text( wi_params_adr, MB_new_pos );
  228.                         break;
  229.  
  230.                     case    TYP_DIR:
  231.                     case    TYP_ARBO:
  232.                         /*
  233.                          * Change les coordonn‚es de l'arbe d'objets … l'‚cran: 
  234.                          */
  235.                         (wi_params_adr -> draw_ptr.tree) -> ob_y +=
  236.                             (int) (wi_params_adr -> seen_y - MB_new_pos);
  237.                         break;
  238.                         
  239.                 /*    default:
  240.                         TRACE1( "Type de donn‚es %X non support‚ par msg_arrowed", wi_params_adr -> type ); */
  241.                 }
  242.                 MB_old_pos = wi_params_adr -> seen_y;    /* Sauve ancienne position */
  243.                 wi_params_adr -> seen_y = MB_new_pos;    /* valide new pos */
  244.                 set_slider_y( wi_params_adr );            /* R‚aff slider */
  245.                 /*
  246.                  * Fait scroller le contenu de la fenˆtre: 
  247.                  */
  248.                 vscroll_window( wi_params_adr, MB_old_pos, MB_new_pos );
  249.             }
  250.             break;
  251.             
  252.         /* 
  253.          * D‚placement horizontal 
  254.          */
  255.         case 4:
  256.         case 5:
  257.         case 6:
  258.         case 7:
  259.             switch ( G_ev_mgpbuff[4] )
  260.             {
  261.                 case 4:                        /* Page vers la gauche */
  262.                     MB_new_pos = l_max ( 0, wi_params_adr -> seen_x - wi_params_adr -> seen_w );
  263.                     break;
  264.  
  265.                 case 5:                        /* Page vers la droite */
  266.                     MB_new_pos = l_min ( wi_params_adr -> total_w - wi_params_adr -> seen_w, 
  267.                         wi_params_adr -> seen_x + wi_params_adr -> seen_w );
  268.                     MB_new_pos = MAX( MB_new_pos, 0 );
  269.                     break;
  270.                     
  271.                 case 6:                        /* Ligne vers la gauche */
  272.                     MB_new_pos = l_max ( 0, wi_params_adr -> seen_x - wi_params_adr -> h_step );
  273.                     break;
  274.  
  275.                 case 7:                        /* Ligne vers la droite */
  276.                     MB_new_pos = l_min ( wi_params_adr -> total_w - wi_params_adr -> seen_w, 
  277.                         wi_params_adr -> seen_x + wi_params_adr -> h_step );
  278.                     MB_new_pos = MAX( MB_new_pos, 0 );
  279.                     break;
  280.             }
  281.             if ( MB_new_pos != wi_params_adr -> seen_x )
  282.             {
  283.                 switch( wi_params_adr -> type )
  284.                 {
  285.                     case    TYP_DIR:
  286.                     case    TYP_ARBO:
  287.                     /* case    TYPTREE: */
  288.                     /* Change les coordonn‚es de l'arbe d'objets … l'‚cran: */
  289.                         (wi_params_adr -> draw_ptr.tree) -> ob_x +=
  290.                             (int) (wi_params_adr -> seen_x - MB_new_pos);
  291.                         break;
  292.                 };
  293.                 MB_old_pos = wi_params_adr -> seen_x;    /* Sauve ancienne position */
  294.                 wi_params_adr -> seen_x = MB_new_pos;    /* valide new pos */
  295.                 set_slider_x( wi_params_adr );        /* R‚aff slider */                            
  296.             /* Fait scroller le contenu de la fenˆtre: */
  297.                 hscroll_window( wi_params_adr, MB_old_pos, MB_new_pos );
  298.             }
  299.             break;
  300.     }
  301. }
  302.  
  303.  
  304.  
  305. /*
  306.  * msg_vslid(-)
  307.  *
  308.  * Purpose:
  309.  * --------
  310.  * WM_VSLID : Ascenseur vertical
  311.  *
  312.  * History:
  313.  * --------
  314.  * fplanque: Created
  315.  * 26.09.94: support type TYP_ERRORS
  316.  */
  317. void    msg_vslid( WIPARAMS    *wi_params_adr )
  318. {
  319.     /* Variables: */
  320.     int    wi_handle = wi_params_adr ->  handle;    
  321.     int    slider_pos=    G_ev_mgpbuff[4];
  322.  
  323.     /* Nouvelle position demand‚e: */
  324.     MB_new_pos = ( slider_pos * 
  325.         (wi_params_adr -> total_h - wi_params_adr -> seen_h) / 1000);
  326.     if ( MB_new_pos != wi_params_adr -> seen_y )
  327.     {
  328.         switch( wi_params_adr -> type )
  329.         {
  330.             case    TYP_TEXT:
  331.             case    TYP_DEBUG:
  332.             case    TYP_ERRORS:
  333.                 /*
  334.                  * Fixe nouvelle ligne se trouvant en haut de l'‚cran: 
  335.                  */
  336.                 vmove_text( wi_params_adr, MB_new_pos );
  337.                 break;
  338.  
  339.             case    TYP_DIR:
  340.             case    TYP_ARBO:
  341.                 /*
  342.                  * Change les coordonn‚es de l'arbe d'objets … l'‚cran: 
  343.                  */
  344.                 (wi_params_adr -> draw_ptr.tree) -> ob_y +=
  345.                     (int) (wi_params_adr -> seen_y - MB_new_pos);
  346.                 break;
  347.                         
  348.             /*    default:
  349.                     TRACE1( "Type de donn‚es %X non support‚ par msg_vslid", wi_params_adr -> type ); */
  350.         }
  351.         MB_old_pos = wi_params_adr -> seen_y;    /* Sauve ancienne position */
  352.         wi_params_adr -> seen_y = MB_new_pos;
  353.         wind_set( wi_handle, WF_VSLIDE, slider_pos);
  354.         /*
  355.          * Fait scroller le contenu de la fenˆtre: 
  356.          * (ou redessine entiŠrement si pas de scroll possible)
  357.          * (Redraw imm‚diat) 
  358.          */
  359.         vscroll_window( wi_params_adr, MB_old_pos, MB_new_pos );
  360.     }
  361. }
  362.  
  363.  
  364.  
  365. /*
  366.  * msg_hslid(-)
  367.  *
  368.  * Purpose:
  369.  * --------
  370.  * WM_HSLID : Ascenseur horizontal
  371.  *
  372.  * History:
  373.  * --------
  374.  * 1993: fplanque: Created
  375.  */
  376. void    msg_hslid( WIPARAMS    *wi_params_adr )
  377. {
  378.     /*
  379.      * Variables: 
  380.      */
  381.     int    wi_handle = wi_params_adr ->  handle;    
  382.     int    slider_pos=    G_ev_mgpbuff[4];
  383.  
  384.     MB_new_pos = (int) ( slider_pos * 
  385.         (wi_params_adr -> total_w - wi_params_adr -> seen_w) / 1000);
  386.  
  387.     switch( wi_params_adr -> type )
  388.     {
  389.         case    TYP_DIR:
  390.         case    TYP_ARBO:
  391.         /* case    TYPTREE: */
  392.         /* Change les coordonn‚es de l'arbe d'objets … l'‚cran: */
  393.             (wi_params_adr -> draw_ptr.tree) -> ob_x +=
  394.                 (int) (wi_params_adr -> seen_x - MB_new_pos);
  395.             break;
  396.     }
  397.     MB_old_pos = wi_params_adr -> seen_x;    /* Sauve ancienne position */
  398.     wi_params_adr -> seen_x = MB_new_pos;
  399.     wind_set( wi_handle, WF_HSLIDE, slider_pos);
  400.  
  401.     /*
  402.      * Fait scroller le contenu de la fenˆtre: 
  403.      * (ou redessine entiŠrement si pas de scroll possible) 
  404.      * (Redraw imm‚diat):
  405.      */
  406.     hscroll_window( wi_params_adr, MB_old_pos, MB_new_pos );
  407. }
  408.  
  409.  
  410.  
  411. /*
  412.  * msg_sized(-)
  413.  *
  414.  * Purpose:
  415.  * --------
  416.  * WM_SIZED : Changement de taille
  417.  *
  418.  * History:
  419.  * --------
  420.  * 1993: fplanque: Created
  421.  */
  422. void    msg_sized( WIPARAMS    *wi_params_adr )
  423. {
  424.     /*
  425.      * Variables: 
  426.      */
  427.     int    wi_handle = wi_params_adr ->  handle;    
  428.  
  429.     MB_new_x = G_ev_mgpbuff[4];
  430.     MB_new_y = G_ev_mgpbuff[5];
  431.     MB_new_w = G_ev_mgpbuff[6];
  432.     MB_new_h = G_ev_mgpbuff[7];
  433.     
  434.     /*
  435.      * Contr“le qu'on ne d‚passe pas la taille maxi autoris‚e: 
  436.      */
  437.     if ( MB_new_w > (wi_params_adr -> maxsize_w) )
  438.     {
  439.         MB_new_w = wi_params_adr -> maxsize_w;
  440.     }
  441.     if ( MB_new_h > (wi_params_adr -> maxsize_h) )
  442.     {
  443.         MB_new_h = wi_params_adr -> maxsize_h;
  444.     }
  445.     
  446.     /*
  447.      * Contr“le s'il faut modifier le contenu de la fenˆtre: 
  448.      */
  449.     switch( wi_params_adr -> type )    
  450.     {
  451.         case    TYP_DIR:
  452.             /*
  453.              * Contr“le s'il faut r‚-arranger les ic“nes: 
  454.              */
  455.             if (    MB_new_w >= (wi_params_adr -> more + G_icon_w)
  456.                 ||    MB_new_w < (wi_params_adr -> more ) )
  457.             {
  458.                 rearrange_dir( wi_params_adr, MB_new_w );
  459.                 /* Demande redraw total de la fenˆtre: */
  460.                 send_fullredraw( wi_params_adr );
  461.             }
  462.             break;
  463.     }
  464.     
  465.     /*
  466.      * Change la taille de la fenˆtre: 
  467.      */
  468.     wind_set( wi_handle, WF_CURRXYWH, MB_new_x, MB_new_y, MB_new_w, MB_new_h );
  469.     wi_params_adr -> curr_x = MB_new_x;
  470.     wi_params_adr -> curr_y = MB_new_y;
  471.     wi_params_adr -> curr_w = MB_new_w;
  472.     wi_params_adr -> curr_h = MB_new_h;
  473.  
  474.     /*
  475.      * Taille asc et repositionnement contenu si n‚cessaire:
  476.      */
  477.     wi_resize( wi_params_adr );         
  478.  
  479.     wi_params_adr -> fulled = 0;        /* Taille norm */                    
  480.  
  481.     /*
  482.      * On s'occupe de positionner le formulaire pour le prochain redraw: 
  483.      */
  484.     if ( wi_params_adr -> type == TYP_ARBO )
  485.     {    /*
  486.          * Si positionnement n‚cessaire: 
  487.          */
  488.         fixform_window(wi_params_adr );    /* Fixe nlle position formulaire */
  489.     }
  490. }
  491.  
  492.  
  493.  
  494. /*
  495.  * msg_moved(-)
  496.  *
  497.  * Purpose:
  498.  * --------
  499.  * WM_MOVED : D‚placement d'une fenˆtre
  500.  *
  501.  * History:
  502.  * --------
  503.  * 1993: fplanque: Created
  504.  * 17.12.94: chge coord arbre OBJC pour les TYP_TREE (n‚cessaire lorsque les ic“nes sont actualis‚es )
  505.  */
  506. void    msg_moved( WIPARAMS    *wi_params_adr )
  507. {
  508.     int    wi_handle = wi_params_adr ->  handle;    
  509.     int    x_move, y_move;    /* D‚placement relatif */
  510.  
  511.     MB_new_x = G_ev_mgpbuff[4];
  512.     MB_new_y = G_ev_mgpbuff[5];
  513.     MB_new_w = G_ev_mgpbuff[6];
  514.     MB_new_h = G_ev_mgpbuff[7];
  515.     
  516.     x_move = MB_new_x - wi_params_adr -> curr_x;
  517.     y_move = MB_new_y - wi_params_adr -> curr_y;
  518.     
  519.     switch( wi_params_adr -> type )    
  520.     {
  521.         case    TYP_DIR:
  522.         case    TYP_ARBO:
  523.         case    TYP_TREE:
  524.             /*
  525.              * Change les coordonn‚es de l'arbe d'objets … l'‚cran: 
  526.              */
  527.             (wi_params_adr -> draw_ptr.tree) -> ob_x += x_move;
  528.             (wi_params_adr -> draw_ptr.tree) -> ob_y += y_move;
  529.     }
  530.     
  531.     wind_set( wi_handle, WF_CURRXYWH, MB_new_x, MB_new_y, MB_new_w, MB_new_h );
  532.     wi_params_adr -> curr_x = MB_new_x;
  533.     wi_params_adr -> curr_y = MB_new_y;
  534.     wi_params_adr -> curr_w = MB_new_w;
  535.     wi_params_adr -> curr_h = MB_new_h;
  536.     wi_params_adr -> work_x += x_move;
  537.     wi_params_adr -> work_y += y_move;
  538.     wi_params_adr -> fulled = 0;        /* Taille norm */                    
  539. }
  540.